package controllers;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.servlet.http.HttpSession;

import modelo.Clasificacionmenu;
import modelo.Combobebidaxpresupuesto;
import modelo.Combobebidaxsalon;
import modelo.Estadopresupuesto;
import modelo.Importepresupuesto;
import modelo.Interesado;
import modelo.Menu;
import modelo.Menuxpresupuesto;
import modelo.Presupuesto;
import modelo.Salon;
import modelo.Servicioadicional;
import modelo.Servicioadicionalxsalon;
import modelo.Tipoevento;
import modelo.Tipoimportefijo;
import modelo.Tipomenu;

import org.primefaces.event.SelectEvent;

import services.ClasificacionmenuService;
import services.ComboBebidaXSalonService;
import services.InteresadoService;
import services.MenuService;
import services.PresupuestoService;
import services.SalonService;
import services.ServicioAdicionalService;
import services.ServicioAdicionalXSalonService;
import services.TipoEventoService;
import services.TipoImporteFijoService;
import services.TipomenuService;

@ManagedBean(name = "presupuestoBean")
@ViewScoped
public class PresupuestoBean implements Serializable {

	private static final long serialVersionUID = -2748351964968090233L;
	
	@ManagedProperty("#{interesadoService}")
	private InteresadoService interesadoService;
	private List<Interesado> listInteresado = new ArrayList<Interesado>();
	private Interesado interesadoSelected = new Interesado();

	@ManagedProperty("#{tipoeventoService}")
	private TipoEventoService tipoEventoService;
	private Tipoevento tipoEvento = new Tipoevento();
	private Tipoevento tipoEventoSelected = new Tipoevento();
	private List<Tipoevento> listTipoEvento = new ArrayList<Tipoevento>();

	@ManagedProperty("#{servicioadicionalService}")
	private ServicioAdicionalService servAdicionalService;
	private List<Servicioadicional> listServicioAdicional = new ArrayList<Servicioadicional>();
	private Servicioadicional servicioAdicionalSelected = new Servicioadicional();

	@ManagedProperty("#{servicioAdicionalXSalonService}")
	private ServicioAdicionalXSalonService servAdicionalXSalonService;
	private Servicioadicionalxsalon servicioXSalonSelected = new Servicioadicionalxsalon();
	private List<Servicioadicionalxsalon> listServicioXSalon = new ArrayList<Servicioadicionalxsalon>();
	private List<Servicioadicionalxsalon> listServicioXSalonSeleccionadas = new ArrayList<Servicioadicionalxsalon>();

	@ManagedProperty("#{tipoImporteFijoService}")
	private TipoImporteFijoService tipoImporteFijoService;
	private Tipoimportefijo importeFijoSelected = new Tipoimportefijo();
	private List<Tipoimportefijo> listImporteFijo = new ArrayList<Tipoimportefijo>();
	private List<Importepresupuesto> listImporteFijoSeleccionados = new ArrayList<Importepresupuesto>();
	private Importepresupuesto importePresupuestoSelected = new Importepresupuesto();
	

//	private List<Servicioadicionalproveedor> listServicioAdicionalProveedor = new ArrayList<Servicioadicionalproveedor>();
//	private List<Servicioadicionalproveedor> listServicioAdicionalProveedorSeleccionadas = new ArrayList<Servicioadicionalproveedor>();
//	private Servicioadicionalproveedor servicioProveedorSelected = new Servicioadicionalproveedor();

	private Presupuesto presupuesto = new Presupuesto();
	
	Boolean bebidasDuenio=new Boolean(true);
	
	@ManagedProperty("#{comboBebidaXSalonService}")
	private ComboBebidaXSalonService comboBebidaXSalonService;
	private Combobebidaxsalon comboBebidaXSalonSelected = new Combobebidaxsalon();
	private Combobebidaxpresupuesto comboBebidaXPresupSelected = new Combobebidaxpresupuesto();
	private List<Combobebidaxsalon> listComboBebidaXSalon = new ArrayList<Combobebidaxsalon>();
	private List<Combobebidaxsalon> listComboBebidaXSalonSeleccionadas = new ArrayList<Combobebidaxsalon>();
//	private List<Combobebidaxpresupuesto> listComboBebidaxPresup = new ArrayList<Combobebidaxpresupuesto>();
	
	@ManagedProperty("#{tipomenuService}")
	private TipomenuService tipoMenuService;
	private Tipomenu tipoMenuSelected = new Tipomenu();
	private List<Tipomenu> listTipoMenu = new ArrayList<Tipomenu>();

	@ManagedProperty("#{clasificacionmenuService}")
	private ClasificacionmenuService clasificacionMenuService;
	private Clasificacionmenu clasificacionSelected = new Clasificacionmenu();
	private List<Clasificacionmenu> listClasificacionMenu= new ArrayList<Clasificacionmenu>();

	@ManagedProperty("#{menuService}")
	private MenuService menuService;
	private Menu menuSelected = new Menu();
	private List<Menu> listMenu= new ArrayList<Menu>();
	
	@ManagedProperty("#{salonService}")
	private SalonService serviceSalon=new SalonService();
	private Salon salon=new Salon();
	
	private Menuxpresupuesto menuPorPresupSelected= new Menuxpresupuesto();
	private List<Menuxpresupuesto> listMenuSeleccionados= new ArrayList<Menuxpresupuesto>();
	
	
	private String cadenaInteresado = ""; 
	private Date fechaPresupuesto=new Date();
	private Float montoTotal=(float) 0;
	int idPresup=0;
	
	@ManagedProperty("#{presupuestoService}")
	private PresupuestoService presupuestoService;
	private Presupuesto presupuestoSelected=new Presupuesto();
	private List<Presupuesto> listPresupuesto=new ArrayList<Presupuesto>();

	

	@PostConstruct
	private void init() {
		FacesContext context = javax.faces.context.FacesContext.getCurrentInstance();
        HttpSession sessionActual = (HttpSession) context.getExternalContext().getSession(false);
        Integer salonSel = null;
        
        if (sessionActual != null)
        {  salonSel = Integer.parseInt(sessionActual.getAttribute("salon").toString());             
        
              salon=serviceSalon.obtenerSalon(salonSel);
        }
        else
        {
        	
        	
        }
		listInteresado = interesadoService.getListaInteresado();
		listTipoEvento = tipoEventoService.getListTipoEvento();

		
		listServicioAdicional = servAdicionalService.getListaServicioAdicionales(salonSel);
		//listServicioAdicional = servAdicionalService.getListaServicioAdicional();
		listServicioXSalon = servAdicionalXSalonService.getListaServicioAdicionales(salonSel);
		listImporteFijo =tipoImporteFijoService.getListaTipoImporteFijo();
		listComboBebidaXSalon=comboBebidaXSalonService.getListacombobebidaxsalon(salonSel);
		listTipoMenu=tipoMenuService.getListaTipomenu();
		listClasificacionMenu=clasificacionMenuService.getListaClasificacionmenu();
		listPresupuesto=presupuestoService.getListaPresupuesto();
		
		presupuesto.setFechaPresupuesto(fechaPresupuesto);
		
        
		
	}

	public void cambiarComboServicio(AjaxBehaviorEvent event) {
		listServicioXSalon.removeAll(listServicioXSalon);
		listServicioXSalon = servAdicionalXSalonService.obtenerServicioAdicionalFiltrados(servicioAdicionalSelected.getIdServicio());

	}

	public void onRowSelect(SelectEvent event) {
		// FacesMessage msg = new FacesMessage(((Car)
		// event.getObject()).getId());
		// FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void agregarSAPSeleccionada() {
		montoTotal+=servicioXSalonSelected.getPrecio();//suma el monto total
		listServicioXSalonSeleccionadas.add(servicioXSalonSelected);
	}
	
	public void agregarMenuSeleccionado() {
		menuPorPresupSelected.setMenu(menuSelected);
		listMenuSeleccionados.add(menuPorPresupSelected);
		montoTotal+=menuSelected.getPrecio()*menuPorPresupSelected.getCantidad();//suma el monto total
		menuPorPresupSelected = new Menuxpresupuesto();
	}

	public void agregarImporteSeleccionada() {
		importePresupuestoSelected.setTipoimportefijo(importeFijoSelected);
		montoTotal+=importePresupuestoSelected.getImporte();//suma el monto total
		listImporteFijoSeleccionados.add(importePresupuestoSelected);
	}
	
	public void agregarComboSeleccionada() {
		comboBebidaXPresupSelected.setCombobebida(comboBebidaXSalonSelected.getCombobebida());
		montoTotal+=comboBebidaXSalonSelected.getPrecio();//suma el monto total
		listComboBebidaXSalonSeleccionadas.add(comboBebidaXSalonSelected);
	}
	
	public void MostrarOcultarPanelBebidas(){
		if(bebidasDuenio==true)
			bebidasDuenio=false;
		else
			bebidasDuenio=true;
	}
	
	public void eliminarCombo(){
		listComboBebidaXSalonSeleccionadas.remove(comboBebidaXSalonSelected);
		montoTotal-=comboBebidaXSalonSelected.getPrecio()*presupuesto.getCantidadInvitado();//suma el monto total
	}
	
	public void eliminarServicio(){
		montoTotal-=servicioXSalonSelected.getPrecio();//suma el monto total
		listServicioXSalonSeleccionadas.remove(servicioXSalonSelected);
	}

	public void eliminarImporteFijo(){
		montoTotal-=importePresupuestoSelected.getImporte();//suma el monto total
		listImporteFijoSeleccionados.remove(importePresupuestoSelected);
	}

	public void eliminarMenu(){
		listMenuSeleccionados.remove(menuPorPresupSelected);
		montoTotal-=menuPorPresupSelected.getMenu().getPrecio()*menuPorPresupSelected.getCantidad();
	}
	
	public void refrescarInteresado(){
		cadenaInteresado=interesadoSelected.getPersona().getNroDocumento()+" - "
				+interesadoSelected.getPersona().getApellido()+", "+interesadoSelected.getPersona().getNombre();
	}
	
	public void cambiarComboMenu(){
		listMenu.removeAll(listMenu);
		listMenu=menuService.getListaMenu(tipoMenuSelected, clasificacionSelected, salon.getIdSalon());
	}
	
	
	public void guardarPresupuesto(ActionEvent actionEvent){
        Estadopresupuesto ep = new Estadopresupuesto(); 
        ep.setIdEstadoPresupuesto(1);
        presupuesto.setEstadopresupuesto(ep);
		presupuesto.setSalon(salon);
		presupuesto.setFechaEvento(fechaPresupuesto);
		presupuesto.setTipoevento(tipoEventoSelected);
		presupuesto.setMontoPresupuesto(montoTotal);
		
		idPresup=presupuestoService.guardarPresup(presupuesto,interesadoSelected,listMenuSeleccionados,listComboBebidaXSalonSeleccionadas,
				listServicioXSalonSeleccionadas,listImporteFijoSeleccionados);
		presupuesto.setIdPresupuesto(idPresup);
		
	}
	
	//Getters & Setters
	public TipoEventoService getTipoEventoService() {
		return tipoEventoService;
	}

	public void setTipoEventoService(TipoEventoService tipoEventoService) {
		this.tipoEventoService = tipoEventoService;
	}

	public Tipoevento getTipoEvento() {
		return tipoEvento;
	}

	public void setTipoEvento(Tipoevento tipoEvento) {
		this.tipoEvento = tipoEvento;
	}

	public Tipoevento getTipoEventoSelected() {
		return tipoEventoSelected;
	}

	public void setTipoEventoSelected(Tipoevento tipoEventoSelected) {
		this.tipoEventoSelected = tipoEventoSelected;
	}

	public List<Tipoevento> getListTipoEvento() {
		return listTipoEvento;
	}

	public void setListTipoEvento(List<Tipoevento> listTipoEvento) {
		this.listTipoEvento = listTipoEvento;
	}

//	public ServicioAdicionalService getServAdicionalService() {
//		return servAdicionalService;
//	}
//
//	public void setServAdicionalService(
//			ServicioAdicionalService servAdicionalService) {
//		this.servAdicionalService = servAdicionalService;
//	}
//
//	public Servicioadicional getServvicioAdicional() {
//		return servicioAdicional;
//	}
//
//	public void setServvicioAdicional(Servicioadicional servvicioAdicional) {
//		this.servicioAdicional = servvicioAdicional;
//	}
//
//	public List<Servicioadicional> getListServicioAdicional() {
//		return listServicioAdicional;
//	}
//
//	public void setListServicioAdicional(
//			List<Servicioadicional> listServicioAdicional) {
//		this.listServicioAdicional = listServicioAdicional;
//	}
//
//	public Servicioadicional getServicioAdicional() {
//		return servicioAdicional;
//	}
//
//	public void setServicioAdicional(Servicioadicional servicioAdicional) {
//		this.servicioAdicional = servicioAdicional;
//	}
//
//	public Servicioadicional getServicioSelected() {
//		return servicioSelected;
//	}
//
//	public void setServicioSelected(Servicioadicional servicioSelected) {
//		this.servicioSelected = servicioSelected;
//	}


	public TipoImporteFijoService getTipoImporteFijoService() {
		return tipoImporteFijoService;
	}

	public void setTipoImporteFijoService(
			TipoImporteFijoService tipoImporteFijoService) {
		this.tipoImporteFijoService = tipoImporteFijoService;
	}

	public Tipoimportefijo getImporteFijoSelected() {
		return importeFijoSelected;
	}

	public void setImporteFijoSelected(Tipoimportefijo importeFijoSelected) {
		this.importeFijoSelected = importeFijoSelected;
	}

	public List<Tipoimportefijo> getListImporteFijo() {
		return listImporteFijo;
	}

	public void setListImporteFijo(List<Tipoimportefijo> listImporteFijo) {
		this.listImporteFijo = listImporteFijo;
	}

	public List<Importepresupuesto> getListImporteFijoSeleccionados() {
		return listImporteFijoSeleccionados;
	}

	public void setListImporteFijoSeleccionados(
			List<Importepresupuesto> listImporteFijoSeleccionados) {
		this.listImporteFijoSeleccionados = listImporteFijoSeleccionados;
	}

	public Importepresupuesto getImportePresupuestoSelected() {
		return importePresupuestoSelected;
	}

	public void setImportePresupuestoSelected(
			Importepresupuesto importePresupuestoSelected) {
		this.importePresupuestoSelected = importePresupuestoSelected;
	}

	

	public Boolean getBebidasDuenio() {
		return bebidasDuenio;
	}

	public void setBebidasDuenio(Boolean bebidasDuenio) {
		this.bebidasDuenio = bebidasDuenio;
	}

	public Presupuesto getPresupuesto() {
		return presupuesto;
	}

	public void setPresupuesto(Presupuesto presupuesto) {
		this.presupuesto = presupuesto;
	}

	public InteresadoService getInteresadoService() {
		return interesadoService;
	}

	public void setInteresadoService(InteresadoService interesadoService) {
		this.interesadoService = interesadoService;
	}

	public Interesado getInteresadoSelected() {
		return interesadoSelected;
	}

	public void setInteresadoSelected(Interesado interesadoSelected) {
		this.interesadoSelected = interesadoSelected;
	}

	public List<Interesado> getListInteresado() {
		return listInteresado;
	}

	public void setListInteresado(List<Interesado> listInteresado) {
		this.listInteresado = listInteresado;
	}

	public String getCadenaInteresado() {
		return cadenaInteresado;
	}

	public void setCadenaInteresado(String cadena) {
		this.cadenaInteresado = cadena;
	}

	public Date getFechaPresupuesto() {
		return fechaPresupuesto;
	}

	public void setFechaPresupuesto(Date fechaPresupuesto) {
		this.fechaPresupuesto = fechaPresupuesto;
	}

	public TipomenuService getTipoMenuService() {
		return tipoMenuService;
	}

	public void setTipoMenuService(TipomenuService tipoMenuService) {
		this.tipoMenuService = tipoMenuService;
	}

	public Tipomenu getTipoMenuSelected() {
		return tipoMenuSelected;
	}

	public void setTipoMenuSelected(Tipomenu tipoMenuSelected) {
		this.tipoMenuSelected = tipoMenuSelected;
	}

	public List<Tipomenu> getListTipoMenu() {
		return listTipoMenu;
	}

	public void setListTipoMenu(List<Tipomenu> listTipoMenu) {
		this.listTipoMenu = listTipoMenu;
	}

	public ClasificacionmenuService getClasificacionMenuService() {
		return clasificacionMenuService;
	}

	public void setClasificacionMenuService(
			ClasificacionmenuService clasificacionMenuService) {
		this.clasificacionMenuService = clasificacionMenuService;
	}

	public Clasificacionmenu getClasificacionSelected() {
		return clasificacionSelected;
	}

	public void setClasificacionSelected(Clasificacionmenu clasificacionSelected) {
		this.clasificacionSelected = clasificacionSelected;
	}

	public List<Clasificacionmenu> getListClasificacionMenu() {
		return listClasificacionMenu;
	}

	public void setListClasificacionMenu(
			List<Clasificacionmenu> listClasificacionMenu) {
		this.listClasificacionMenu = listClasificacionMenu;
	}

	public List<Menu> getListMenu() {
		return listMenu;
	}

	public void setListMenu(List<Menu> listMenu) {
		this.listMenu = listMenu;
	}

	public MenuService getMenuService() {
		return menuService;
	}

	public void setMenuService(MenuService menuService) {
		this.menuService = menuService;
	}

	public Menu getMenuSelected() {
		return menuSelected;
	}

	public void setMenuSelected(Menu menuSelected) {
		this.menuSelected = menuSelected;
	}

	public Menuxpresupuesto getMenuPorPresupSelected() {
		return menuPorPresupSelected;
	}

	public void setMenuPorPresupSelected(Menuxpresupuesto menuPorPresupSelected) {
		this.menuPorPresupSelected = menuPorPresupSelected;
	}

	public List<Menuxpresupuesto> getListMenuSeleccionados() {
		return listMenuSeleccionados;
	}

	public void setListMenuSeleccionados(
			List<Menuxpresupuesto> listMenuSeleccionados) {
		this.listMenuSeleccionados = listMenuSeleccionados;
	}

	public Float getMontoTotal() {
		return montoTotal;
	}

	public void setMontoTotal(Float montoTotal) {
		this.montoTotal = montoTotal;
	}

	public ComboBebidaXSalonService getComboBebidaXSalonService() {
		return comboBebidaXSalonService;
	}

	public void setComboBebidaXSalonService(
			ComboBebidaXSalonService comboBebidaXSalonService) {
		this.comboBebidaXSalonService = comboBebidaXSalonService;
	}

	public Combobebidaxpresupuesto getComboBebidaXPresupSelected() {
		return comboBebidaXPresupSelected;
	}

	public void setComboBebidaXPresupSelected(
			Combobebidaxpresupuesto comboBebidaXPresupSelected) {
		this.comboBebidaXPresupSelected = comboBebidaXPresupSelected;
	}

	public List<Combobebidaxsalon> getListComboBebidaXSalon() {
		return listComboBebidaXSalon;
	}

	public void setListComboBebidaXSalon(
			List<Combobebidaxsalon> listComboBebidaXSalon) {
		this.listComboBebidaXSalon = listComboBebidaXSalon;
	}

//	public List<Combobebidaxpresupuesto> getListComboBebidaxPresup() {
//		return listComboBebidaxPresup;
//	}
//
//	public void setListComboBebidaxPresup(
//			List<Combobebidaxpresupuesto> listComboBebidaxPresup) {
//		this.listComboBebidaxPresup = listComboBebidaxPresup;
//	}

	public Combobebidaxsalon getComboBebidaXSalonSelected() {
		return comboBebidaXSalonSelected;
	}

	public void setComboBebidaXSalonSelected(
			Combobebidaxsalon comboBebidaXSalonSelected) {
		this.comboBebidaXSalonSelected = comboBebidaXSalonSelected;
	}

	public List<Combobebidaxsalon> getListComboBebidaXSalonSeleccionadas() {
		return listComboBebidaXSalonSeleccionadas;
	}

	public void setListComboBebidaXSalonSeleccionadas(
			List<Combobebidaxsalon> listComboBebidaXSalonSeleccionadas) {
		this.listComboBebidaXSalonSeleccionadas = listComboBebidaXSalonSeleccionadas;
	}

//	public ServicioAdicionalxSalonService getServAdicionalService() {
//		return servAdicionalService;
//	}
//
//	public void setServAdicionalService(
//			ServicioAdicionalxSalonService servAdicionalService) {
//		this.servAdicionalService = servAdicionalService;
//	}


//	public List<Servicioadicionalxsalon> getListServicioAdicional() {
//		return listServicioAdicional;
//	}
//
//	public void setListServicioAdicional(
//			List<Servicioadicionalxsalon> listServicioAdicional) {
//		this.listServicioAdicional = listServicioAdicional;
//	}

	public List<Servicioadicionalxsalon> getListServicioXSalon() {
		return listServicioXSalon;
	}

	public void setListServicioXSalon(
			List<Servicioadicionalxsalon> listServicioXSalon) {
		this.listServicioXSalon = listServicioXSalon;
	}

	public void setServAdicionalService(
			ServicioAdicionalService servAdicionalService) {
		this.servAdicionalService = servAdicionalService;
	}

	
	public ServicioAdicionalService getServAdicionalService() {
		return servAdicionalService;
	}

	

	public Servicioadicionalxsalon getServicioXSalonSelected() {
		return servicioXSalonSelected;
	}

	public void setServicioXSalonSelected(
			Servicioadicionalxsalon servicioXSalonSelected) {
		this.servicioXSalonSelected = servicioXSalonSelected;
	}

	public List<Servicioadicionalxsalon> getListServicioXSalonSeleccionadas() {
		return listServicioXSalonSeleccionadas;
	}

	public void setListServicioXSalonSeleccionadas(
			List<Servicioadicionalxsalon> listServicioXSalonSeleccionadas) {
		this.listServicioXSalonSeleccionadas = listServicioXSalonSeleccionadas;
	}

	public PresupuestoService getPresupuestoService() {
		return presupuestoService;
	}

	public void setPresupuestoService(PresupuestoService presupuestoService) {
		this.presupuestoService = presupuestoService;
	}

	public ServicioAdicionalXSalonService getServAdicionalXSalonService() {
		return servAdicionalXSalonService;
	}

	public void setServAdicionalXSalonService(ServicioAdicionalXSalonService servAdicionalXSalonService) {
		this.servAdicionalXSalonService = servAdicionalXSalonService;
	}

	public Presupuesto getPresupuestoSelected() {
		return presupuestoSelected;
	}

	public void setPresupuestoSelected(Presupuesto presupuestoSelected) {
		this.presupuestoSelected = presupuestoSelected;
	}

	public List<Presupuesto> getListPresupuesto() {
		return listPresupuesto;
	}

	public void setListPresupuesto(List<Presupuesto> listPresupuesto) {
		this.listPresupuesto = listPresupuesto;
	}

	public int getIdPresup() {
		return idPresup;
	}

	public void setIdPresup(int idPresup) {
		this.idPresup = idPresup;
	}

	public Salon getSalon() {
		return salon;
	}

	public void setSalon(Salon salon) {
		this.salon = salon;
	}

	public SalonService getServiceSalon() {
		return serviceSalon;
	}

	public void setServiceSalon(SalonService serviceSalon) {
		this.serviceSalon = serviceSalon;
	}

	public String goPresupuesto()
	{
		
		return "ListadoPresupuesto";
	}

	public List<Servicioadicional> getListServicioAdicional() {
		return listServicioAdicional;
	}

	public void setListServicioAdicional(
			List<Servicioadicional> listServicioAdicional) {
		this.listServicioAdicional = listServicioAdicional;
	}

	public Servicioadicional getServicioAdicionalSelected() {
		return servicioAdicionalSelected;
	}

	public void setServicioAdicionalSelected(
			Servicioadicional servicioAdicionalSelected) {
		this.servicioAdicionalSelected = servicioAdicionalSelected;
	}


	// public List<Proveedor> getListProvisoriaProveedores() {
	// return listProvisoriaProveedores;
	// }
	//
	// public void setListProvisoriaProveedores(
	// List<Proveedor> listProvisoriaProveedores) {
	// this.listProvisoriaProveedores = listProvisoriaProveedores;
	// }

}
